package vf1.rn;

/************************************************************************
  			VF1_RN_Batalha.java

    BattleField Tactics Online - A Strategy RPG Online Game
    Copyright (C) 2008  
	Douglas Ribeiro, Kely Marques Rosa, Rodrigo da Fonseca Lacerda

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

	Contact: douglas666@gmail.com
 **************************************************************************/


import java.util.*;

import vf1.iu.VF1_IU_IBatalha;
import vf1.so.VF1_SO_BFTCliente;


/**
 * Class VF1_RN_Batalha
 */
public class VF1_RN_Batalha implements VF1_RN_IBatalha {

	//
	// Fields
	//

	private VF1_IU_IBatalha observer;
	private VF1_RN_Jogador jogador1;
	private VF1_RN_Jogador jogador2;
	private VF1_RN_Jogador jogador3;
	private VF1_RN_Jogador jogador4;
	private int movimento;
	private int ataque;
	private boolean existencia;

	//
	// Constructors
	//
	public VF1_RN_Batalha () { };

	//
	// Methods
	//


	//
	// Accessor methods
	//

	/**
	 * Set the value of jogador1
	 * @param newVar the new value of jogador1
	 */
	private void setJogador1 ( VF1_RN_Jogador newVar ) {
		jogador1 = newVar;
	}

	/**
	 * Get the value of jogador1
	 * @return the value of jogador1
	 */
	public VF1_RN_Jogador getJogador1 ( ) {
		return jogador1;
	}

	/**
	 * Set the value of jogador2
	 * @param newVar the new value of jogador2
	 */
	private void setJogador2 ( VF1_RN_Jogador newVar ) {
		jogador2 = newVar;
	}

	/**
	 * Get the value of jogador2
	 * @return the value of jogador2
	 */
	public VF1_RN_Jogador getJogador2 ( ) {
		return jogador2;
	}

	/**
	 * Set the value of jogador3
	 * @param newVar the new value of jogador3
	 */
	private void setJogador3 ( VF1_RN_Jogador newVar ) {
		jogador3 = newVar;
	}

	/**
	 * Get the value of jogador3
	 * @return the value of jogador3
	 */
	public VF1_RN_Jogador getJogador3 ( ) {
		return jogador3;
	}

	/**
	 * Set the value of jogador4
	 * @param newVar the new value of jogador4
	 */
	private void setJogador4 ( VF1_RN_Jogador newVar ) {
		jogador4 = newVar;
	}

	/**
	 * Get the value of jogador4
	 * @return the value of jogador4
	 */
	public VF1_RN_Jogador getJogador4 ( ) {
		return jogador4;
	}

	/**
	 * Set the value of movimento
	 * @param newVar the new value of movimento
	 */
	private void setMovimento ( int newVar ) {
		movimento = newVar;
	}

	/**
	 * Get the value of movimento
	 * @return the value of movimento
	 */
	public int getMovimento ( ) {
		return movimento;
	}

	/**
	 * Set the value of ataque
	 * @param newVar the new value of ataque
	 */
	private void setAtaque ( int newVar ) {
		ataque = newVar;
	}

	/**
	 * Get the value of ataque
	 * @return the value of ataque
	 */
	public int getAtaque ( ) {
		return ataque;
	}

	//
	// Other methods
	//

	/**
	 * @param        j1
	 * @param        j2
	 * @param        j3
	 * @param        j4
	 */
	public void iniciarBatalha( VF1_RN_Jogador jogador1, VF1_RN_Jogador jogador2, VF1_RN_Jogador jogador3, VF1_RN_Jogador jogador4 )
	{

		/*MA
	    this.setJogador1( j1 );
	    this.setJogador2( j2 );
	    this.setJogador3( j3 );
	    this.setJogador4( j4 );
	    VF1_SO_BFTCliente cliente = VF1_SO_BFTCliente.getCliente;
	    VF1_SO_BFTCliente.iniciarTelaBatalha; //Mudado! a tela batalha q inicializa o rn batalha
	    notifica IU-Batalha por observer; */

		setExistencia(true);
		
		this.setJogador1( jogador1 );
		this.setJogador2( jogador2 );
		this.setJogador3( jogador3 );
		this.setJogador4( jogador4 );

		//matando jogadores 3 e 4
		this.getJogador3().getBarbara().setPv(0);
		this.getJogador3().getNinja().setPv(0);
		this.getJogador3().getGuerreira().setPv(0);
		this.getJogador4().getBarbara().setPv(0);
		this.getJogador4().getNinja().setPv(0);
		this.getJogador4().getGuerreira().setPv(0);
		
		//notifyObserver();	    

	}


	/**
	 * @param        personagem
	 */
	public void habilitarMovimento( VF1_RN_Personagem personagem )
	{
		//MA:
		//movimento = personagem.id(); //strategy!
		//notificar IU-batalha por observer; - nao existe mais
		setMovimento(personagem.id());
	}


	/**
	 * @param        personagem
	 */
	public void habilitarAtaque( VF1_RN_Personagem personagem )
	{
		//MA:
		//ataque=personagem.id(); //adicionar m�todo em subclasses de personagem, retorna 1 para guerreira, 2 para ninja e 3 para barbara --> Double dispatch!
		//notificar por observer a IU-Batalha; - nao existe mais
		setAtaque(personagem.id());

	}

	public void atualizarPosicao( String jogador_nome, int personagem_id, int posicao_x, int posicao_y )
	{
		/*  MA:
    personagem.setPosicao_x(posicao_x);
    personagem.setPosicao_y(posicao_y);
    notificar IU-Batalha por observer; */
		
		VF1_RN_Jogador jogador = new VF1_RN_Jogador() ;
		
		if (jogador_nome.equals(jogador1.getNome()))
			jogador = jogador1;
		if (jogador_nome.equals(jogador2.getNome()))
			jogador = jogador2;
		if (jogador_nome.equals(jogador3.getNome()))
			jogador = jogador3;
		if (jogador_nome.equals(jogador4.getNome()))
			jogador = jogador4;	
		if(personagem_id==1){
			jogador.getBarbara().setPosicao_x(posicao_x);
			jogador.getBarbara().setPosicao_y(posicao_y);
		}
		if(personagem_id==2){
			jogador.getGuerreira().setPosicao_x(posicao_x);
			jogador.getGuerreira().setPosicao_y(posicao_y);
			}
		if(personagem_id==3){
			jogador.getNinja().setPosicao_x(posicao_x);
			jogador.getNinja().setPosicao_y(posicao_y);
		}
		notifyObserver();
		//VF1_SO_BFTCliente cliente = VF1_SO_BFTCliente.getCliente();
		//cliente.getTela_batalha().synchronizeState(this);
	}


	/**
	 * @param        personagem
	 * @param        posicao_x
	 * @param        posicao_y
	 */
	/*public void personagem( VF1_RN_Personagem personagem, int posicao_x, int posicao_y )
	{

	}*/


	/**
	 * @param        personagem
	 * @param        status
	 */
	public void atualizarStatus(String jogador_nome, int personagem_id, int status )
	{ 
		//MA:
		//personagem.setPV(status);
		VF1_RN_Jogador jogador = new VF1_RN_Jogador() ;
		
		if (jogador_nome.equals(jogador1.getNome()))
			jogador = jogador1;
		if (jogador_nome.equals(jogador2.getNome()))
			jogador = jogador2;
		if (jogador_nome.equals(jogador3.getNome()))
			jogador = jogador3;
		if (jogador_nome.equals(jogador4.getNome()))
			jogador = jogador4;	
		if(personagem_id==1){
			jogador.getBarbara().setPv(status);
		}
		if(personagem_id==2){
			jogador.getGuerreira().setPv(status);
			}
		if(personagem_id==3){
			jogador.getNinja().setPv(status);			
	  }
		VF1_SO_BFTCliente cliente = VF1_SO_BFTCliente.getCliente();
		cliente.getTela_batalha().synchronizeState(this);
	}


	/**
	 */
	public void desabilitarMovimento(  )
	{
		//MA:
		// movimento = 0;
		// notifica IU-Batalha por observer;- nao existe mais
		setMovimento(0);
	}


	/**
	 * @param        personagem
	 */
	public void exibirAreaAtaque( VF1_RN_Personagem personagem )
	{

	}


	/**
	 * @param        personagem
	 * @param        posicao_x
	 * @param        posicao_y
	 */
	/*public void enviaPosicaoAtacada( VF1_RN_Personagem personagem, int posicao_x, int posicao_y )
	{
		//MA:
		//envia a posicao_x e a posicao_y para o objeto correto de 
		//VF2_RN_Turno usando seu m�todo atacarPosicao( int posicao_x, int posicao_y );
		
	}*/


	/**
	 */
	public void desabilitarAtaque(  )
	{
		//MA:
		//ataque = 0;
		//notifica IU-Batalha por observer; - nao existe mais

		setAtaque(0);

	}


	/**
	 * @param        jogador
	 */
	public void finalizarBatalha( String vencedor )
	{
		/*MA:
	    this.apresentarMensagem ( jogador.getNome );
	    existencia = FALSE;
	    notifica IU-Batalha por observer;*/

		this.apresentarMensagem(vencedor);
		setExistencia(false);
		
		//this.notifyObserver();
	}


	/**
	 * @param        mensagem
	 */
	public void apresentarMensagem( String mensagem )
	{
		/*
	  VF1_SO_BFTCliente cliente = VF1_SO_BFTCliente.getCliente();
	    //Singleton!
	    cliente.apresentarMensagem(mensagem);*/

	}


	/**
	 * @param        personagem
	 */
	public void exibirAreaMovimento( VF1_RN_Personagem personagem )
	{

	}


	/**
	 * @param        personagem
	 * @param        posicao_x
	 * @param        posicao_y
	 */
	/*public void enviarPosicaoDePersonagem( VF1_RN_Personagem personagem, int posicao_x, int posicao_y )
	{
		//MA:
	  //envia a posicao_x e a posicao_y para o objeto correto de 
	  //VF2_RN_Turno usando seu m�todo moverPersonagem( int posicao_x, int posicao_y );
		
	
		
	}*/

	@Override
	public void notifyObserver() {
		// TODO Auto-generated method stub
		getObserver().synchronizeState(this);
	}

	@Override
	public void registerObserver(VF1_IU_IBatalha observer) {
		// TODO Auto-generated method stub
		setObserver(observer);
	}

	@Override
	public void unregisterObserver(VF1_IU_IBatalha observer) {
		// TODO Auto-generated method stub

	}

	protected VF1_IU_IBatalha getObserver() {
		return observer;
	}

	protected void setObserver(VF1_IU_IBatalha observer) {
		this.observer = observer;
	}

	public boolean isExistencia() {
		return existencia;
	}

	public void setExistencia(boolean existencia) {
		this.existencia = existencia;
	}

	
}
